package org.andengine.opengl.vbo;

import org.andengine.opengl.shader.ShaderProgram;
import org.andengine.opengl.util.GLState;
import org.andengine.util.IDisposable;

import java.nio.ByteBuffer;

/**
 * (c) Zynga 2011
 *
 * @author Nicolas Gramlich <ngramlich@zynga.com>
 * @since 14:32:10 - 15.11.2011
 */
public interface IVertexBufferObject extends IDisposable {
    // ===========================================================
    // Constants
    // ===========================================================

    public static final int HARDWARE_BUFFER_ID_INVALID = -1;

    // ===========================================================
    // Methods
    // ===========================================================

    public boolean isAutoDispose();

    public int getHardwareBufferID();

    public boolean isLoadedToHardware();

    /**
     * Mark this {@link VertexBufferObject} as not not loaded to hardware.
     * It will reload itself to hardware when it gets used again.
     */
    public void setNotLoadedToHardware();

    public void unloadFromHardware(final GLState pGLState);

    public boolean isDirtyOnHardware();

    /**
     * Mark this {@link VertexBufferObject} dirty so it gets updated on the hardware.
     */
    public void setDirtyOnHardware();

    /**
     * @return the number of <code>float</code>s that fit into this {@link IVertexBufferObject}.
     */
    public int getCapacity();

    /**
     * @return the number of <code>byte</code>s that fit into this {@link IVertexBufferObject}.
     */
    public int getByteCapacity();

    /**
     * @return the number of <code>byte</code>s that are allocated on the heap.
     */
    public int getHeapMemoryByteSize();

    /**
     * @return the number of <code>byte</code>s that are allocated on the native heap (through direct {@link ByteBuffer}s).
     */
    public int getNativeHeapMemoryByteSize();

    /**
     * @return the number of <code>byte</code>s that are allocated on the GPU.
     */
    public int getGPUMemoryByteSize();

    public void bind(final GLState pGLState);

    public void bind(final GLState pGLState, final ShaderProgram pShaderProgram);

    public void unbind(final GLState pGLState, final ShaderProgram pShaderProgram);

    public VertexBufferObjectManager getVertexBufferObjectManager();

    public void draw(final int pPrimitiveType, final int pCount);

    public void draw(final int pPrimitiveType, final int pOffset, final int pCount);
}
